/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Envios.Controlador;

import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JOptionPane;
import pe.edu.pucp.Envios.DAO.EnviosDAO;
import pe.edu.pucp.Envios.Vista.AlertarEnvioGUI;
import pe.edu.pucp.Modelo.Envio;
import pe.edu.pucp.Modelo.EstadoEnvio;
import pe.edu.pucp.Modelo.Itinerario;
import pe.edu.pucp.Modelo.Paquete;
import pe.edu.pucp.Modelo.Usuario;
import pe.edu.pucp.Util.Constante;
import pe.edu.pucp.Util.EmailHelper;
import pe.edu.pucp.Util.LogHelper;
import pe.edu.pucp.Util.ValHelper;

/**
 *
 * @author pachon
 */
public class AlertarEnvioControlador {
    private EnviosDAO m;
    private Usuario user;
    private Itinerario itinerario;
    private Envio envio;
    private AlertarEnvioGUI view;
    private ArrayList<Paquete> lstPaquetes;
    private ArrayList<EstadoEnvio> lstEstados;
    
    public AlertarEnvioControlador(EnviosDAO dao, AlertarEnvioGUI vista, Usuario user, Itinerario itinerario){
        this.m = dao;
        this.view = vista;
        this.itinerario = itinerario;
        this.user = user;
        this.envio = this.itinerario.getEnvio();
        this.lstPaquetes = m.GenerarPaquetes(envio);
        SetValues();
        view.addAlertarButtonListener(new AlertarButtonListener());
        view.addCancelarButtonListener(new CancelarButtonListener());
        view.addGenerarButtonListener(new GenerarButtonListener());
        this.view.addSoloTextoListener(new SoloTextoListener());
        this.view.addSoloNumerosListener(new SoloNumerosListener());
    }
    
    //Setea valores
    private void SetValues(){
        int numero = itinerario.getVuelo().getIdvuelo();        
        view.setVuelo(String.valueOf(numero));
        view.setCiudad(itinerario.getVuelo().getAeropuertoByIdorigen().getCiudad().getDescripcion());
        Date date = new Date();        
        DateFormat formatter ; 
        formatter = new SimpleDateFormat("HH:mm:ss");
        String hora = formatter.format(date);
        lstEstados = m.listarEstadosEnvio();
        view.llenaEstados(lstEstados);
        view.setHora(hora);
        view.setPaquetes(envio);
        view.setNumPaquetes("0");
        view.setEstados(itinerario.getEnvio().getEstadoEnvio().getIdestado());        
        view.setCliente(envio.getCliente());
        view.llenaGrilla(lstPaquetes);
    }
    
    
    
    
    class CancelarButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            view.dispose();            
        }        
    }
    class AlertarButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
                
        try { 
            if (!view.esEditable()){
                
                 m.RegistrarNotaEntrada(itinerario, user);
                 LogHelper.registrarOperacion(user, Constante.ACCION_REGISTRAR, Constante.OBJETO_NOTA_ENTRADA, "Se registró la nota de entrada de envios desde el "+user.getAeropuerto().getDescripcion());                 
                 String nombre = envio.getCliente().getNombre() + " " + envio.getCliente().getAppaterno() + " " + envio.getCliente().getApmaterno();
                 String usuario = user.getNombre() + " " +user.getAppaterno() + " "+user.getApmaterno();
                 String correo =envio.getCliente().getCorreo()+envio.getCliente().getTipoCorreo().getExtension();
                 EmailHelper.enviarEmailEnvios(correo, nombre, usuario, envio, m.GetCiudadOrigen(envio), envio.getAeropuerto().getCiudad(), user.getAeropuerto().getCiudad(), new Date());
                 JOptionPane.showMessageDialog(view.getPadre(), "Se registró correctamente la nota de entrada", "Confirmación", JOptionPane.INFORMATION_MESSAGE); 
                 view.dispose();
                
            } else{
                if (Integer.valueOf(view.getNumpaquetes())== 0 ){
                     m.RegistrarNotaEntrada(itinerario, user);
                     LogHelper.registrarOperacion(user, Constante.ACCION_REGISTRAR, Constante.OBJETO_NOTA_ENTRADA, "Se registró la nota de entrada de envios desde el "+user.getAeropuerto().getDescripcion());
                     String nombre = envio.getCliente().getNombre() + " " + envio.getCliente().getAppaterno() + " " + envio.getCliente().getApmaterno();
                     String usuario = user.getNombre() + " " +user.getAppaterno() + " "+user.getApmaterno();
                     String correo =envio.getCliente().getCorreo()+envio.getCliente().getTipoCorreo().getExtension();
                     EmailHelper.enviarEmailEnvios(correo, nombre, usuario, envio, m.GetCiudadOrigen(envio), envio.getAeropuerto().getCiudad(), user.getAeropuerto().getCiudad(), new Date());
                     JOptionPane.showMessageDialog(view.getPadre(), "Se registró correctamente la nota de entrada", "Confirmación", JOptionPane.INFORMATION_MESSAGE); 
                     view.dispose();
                } else{
                    JOptionPane.showMessageDialog(view.getPadre(), "Si reporta irregularidades debe generar la nota de credito", "Aviso", JOptionPane.INFORMATION_MESSAGE); 
                }
            }
         
        } catch(HeadlessException | NumberFormatException ec) {
            JOptionPane.showMessageDialog(view.getPadre(), "No se pudo registrar la nota de entrada. Error: " + ec.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); 
        }
           
        }        
    }
    
    class GenerarButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                //GenerarNota de Credito
                int numPaquetes=0;
                for (Paquete p : lstPaquetes){
                    if (p.getEstadoPaquete().getIdestado()!=3){
                        numPaquetes++;
                    }
                }
                if (Integer.valueOf(view.getPaquetes())== 0 ){
                    JOptionPane.showMessageDialog(view.getPadre(), "No se indican irregularidades", "Error", JOptionPane.ERROR_MESSAGE); 
                } else if (Integer.valueOf(view.getNumpaquetes()) >= numPaquetes) {
                    JOptionPane.showMessageDialog(view.getPadre(), "La cantidad de paquetes es mayor a la maxima", "Error", JOptionPane.ERROR_MESSAGE); 
                }else{
                    m.GenerarNotadeCredito(user, envio, Integer.parseInt(view.getNumpaquetes())); 
                    LogHelper.registrarOperacion(user, Constante.ACCION_REGISTRAR, Constante.OBJETO_NOTA_CREDITO, "Se registró la nota de credito para "+Integer.parseInt(view.getNumpaquetes())+" paquetes");
                    view.bloquearNumPaquetes();
                    view.bloquearNota();
                    JOptionPane.showMessageDialog(view.getPadre(), "Se registró correctamente la nota de crédito", "Confirmación", JOptionPane.INFORMATION_MESSAGE); 
                    lstPaquetes = m.GenerarPaquetes(envio);
                    view.llenaGrilla(lstPaquetes);
                }

            } catch( NumberFormatException | HeadlessException ec) {
                JOptionPane.showMessageDialog(view.getPadre(), "No se pudo registrar la nota de crédito. Error: " + ec.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); 

            }
        }        
    }
    class SoloTextoListener extends KeyAdapter {
        @Override
        public void keyTyped(KeyEvent e) {
           ValHelper.soloDigitoTexto(e);
        }     
    }
    
    class SoloNumerosListener extends KeyAdapter {
        @Override
        public void keyTyped(KeyEvent e) {
            ValHelper.soloDigito(e);
        }   
    }
}
